PathMeasure 类似一个计算器,可以计算出指定路径的一些信息,比如路径总长、指定长度所对应的坐标等。我们可以通过 PathMeasure 可以实现复杂的动画效果。
5.1.1 初始化
|
|
参数 boolean forceClosed 表示Path 最终是否需要闭合,如果为 true,则不管关联的 Path 是否是闭合的,都会被闭合。但是 forceClosed 参数对绑定的 Path 不会产生任何影响,例如一个折线段的 Path,本身是没有闭合的,当 forceClosed 设置为 true 的时候,PathMeasure 计算的 Path 是闭合的,但 Path 绘制出来的是不会闭合的。forceClosed 参数只对 PathMeasure 的测量结果有影响,例如一个折线段的 Path,本身没有闭合,当 forceClosed 设置为 true 时,PathMeasure 的计算就会包含最后一段闭合的路径,与原来的 Path 不同。
示例:
结果:
从图中可以看到,我们创建的只是正方形的三条边,而日志打印结果表示:如果 forceClosed 为 false,则测量的是当前 Path 状态的长度;如果 forceClosed 为 true,则不论 Path 是否闭合,测量的都是 Path 的闭合长度。
5.1.2 简单函数使用
1. getLength()
|
|
2. isClosed()
|
|
3. nextContour()
|
|
Path 可以由多条曲线构成,但不论是 getLength()、getSegment() 还是其他函数,都会只针对其中第一条线段进行计算。而 nextContour() 就是用于跳转到下一条曲线的函数。如果跳转成功,则返回 true;如果跳转失败,则返回 false。
示例:
结果:
通过这个例子可以得出以下结论:
- nextContour() 函数得到的曲线的顺序与 Path 中添加的顺序相同。
- getLength() 等函数针对的是当前线段,不是整个 Path。
5.1.3 getSegment() 函数
|
|
用于截取整个 Path 中的某个片段,通过参数 startD 与 stopD 来控制截取的长度,并将截取后的 Path 保存并添加(不是替换)到参数 dst 中。startWithMoveTo 表示起始点是否使用 moveTo 将路径的新起点移动到结果 Path 的起始点,通常设置为 true,以保证每次截取的 Path 都是正常的、完整的;如果设置为 false,则新增的片段会从上一次 Path 终点开始计算,这样可以保证截取的 Path 片段是连续的,但不一定时正常的。
注意:
- 如果 startD、stopD 的数值不在取值范围 [0, getLength] 内,或者 startD == stopD,则返回值为 false,而且不会改变 dst 中的内容。
- 使用 getSegment() 函数时需要禁用硬件加速功能。 setLayerType(LAYER_TYPE_SOFTWARE, null)。
示例一:用法举例
效果图如下:
结论一:路径截取是以路径的左上角为起始点开始的。
示例二:逆时针
将生成路径的方式指定为逆时针。
效果图如下:
结论二:路径的截取方向与路径的生成方向相同。
示例三:如果 dst 路径不为空
效果图如下:
结论三:会将截取的 Path 片段添加到路径 dst 中,而不是替换 dst 中的内容。
示例四:如果 startWithMoveTo 参数为 false
效果图如下:
结论四:如果 startWithMoveTo 为 true,则被截取出来的 Path 片段保持原状;如果 startWithMoveTo 为 false,则会截取出来的 Path 片段的起始点移动到 dst 的最后一个点,以保证 dst 路径的连续性。
示例:路径加载动画
|
|
上述示例中,在生成动画路径时,始终是从 0 位置开始的。如果我们稍微改变一下生成路径的起始点位置,就可以完成一个比较有意思的加载图动画,效果图如下所示:
修改代码如下:
5.1.4 getPosTan() 函数
|
|
用于得到路径上某一长度的位置以及该位置的正切值。参数:
- float distance:距离 Path 起始点的长度,取值范围 0 ≤ distance ≤ getLength。
- float[] pos:该点的坐标值。pos[0] 表示 x 坐标,pos[1] 表示 y 坐标。
- float[] tan:该点的正切值。
在 Math 类中,有两个求反切值的函数,即夹角 a 的值。
示例:飞机加载动画
动画效果:
|
|
5.1.5 getMatrix() 函数
|
|
用于得到路径上某一长度的位置以及该位置的正切值的矩阵。
- distance:距离 Path 起始点的长度。
- matrix:根据flags 封装好的 matrix 会根据 flags 的设置而存入不同的内容。
- flags:用于指定哪些内容会存入 matrix 中。flags 值有两个:PathMeasure.POSITION_MATRIX_FLAG 表示获取位置信息;PathMeasure.TANGENT_MATRIX_FLAG 表示获取切边信息,使得图片按 Path 旋转。可以只指定一个,也可以用“|”同时指定。
很明显,getMatrix() 函数只是 PathMeasure.getPosTan() 函数的另一种实现而已。如下更改飞机加载动画:
5.1.6 示例:支付宝支付成功动画
|
|
使用自定义控件